/*
 * Copyright 2002-2018 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.beans.factory.support;

import org.springframework.beans.factory.config.BeanPostProcessor;

/**
 * Post-processor callback interface for <i>merged</i> bean definitions at runtime.
 * {@link BeanPostProcessor} implementations may implement this sub-interface in order
 * to post-process the merged bean definition (a processed copy of the original bean
 * definition) that the Spring {@code BeanFactory} uses to create a bean instance.
 *
 * <p>The {@link #postProcessMergedBeanDefinition} method may for example introspect
 * the bean definition in order to prepare some cached metadata before post-processing
 * actual instances of a bean. It is also allowed to modify the bean definition but
 * <i>only</i> for definition properties which are actually intended for concurrent
 * modification. Essentially, this only applies to operations defined on the
 * {@link RootBeanDefinition} itself but not to the properties of its base classes.
 *
 * @author Juergen Hoeller
 * @since 2.5
 * @see org.springframework.beans.factory.config.ConfigurableBeanFactory#getMergedBeanDefinition
 */
/**
 * 接口MergedBeanDefinitionPostProcessor扩展了BeanPostProcessor接口
 * 此接口主要用于在Bean定义合并后，Bean对象实例化之前，对合并后的Bean定义进行处理
 * 实现该接口的类可以在Bean定义的所有属性都被设置之后，但是Bean对象还没有创建之前执行自定义逻辑
 * 这通常用于对Bean定义的属性进行进一步的修改或增强
 * MergedBeanDefinition是spring获取bean流程中的一个重要处理过程，
 * 他将基础的BeanDefinition合并为一个新的BeanDefinition对象(RootBeanDefinition)，
 * 后续的处理过程都依赖这个新对象。
 */
public interface MergedBeanDefinitionPostProcessor extends BeanPostProcessor {

	/**
	 * Post-process the given merged bean definition for the specified bean.
	 * @param beanDefinition the merged bean definition for the bean
	 * @param beanType the actual type of the managed bean instance
	 * @param beanName the name of the bean
	 * @see AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors
	 */
	/**
	 * 在BeanDefinition合并后进行后处理
	 * <p>
	 * 此方法允许对合并后的BeanDefinition进行进一步的修改或增强，以便在实例化bean之前确保其配置是最新的和最正确的
	 * 它是在所有的bean定义都加载并合并后，但是bean实例化之前调用的
	 *
	 * @param beanDefinition 合并后的BeanDefinition对象，它包含了bean的各种配置信息
	 * @param beanType bean的类型，可以是具体的类或者接口
	 * @param beanName bean的名称，用于在bean工厂中唯一标识一个bean
	 */
	void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName);
	/**
	 * A notification that the bean definition for the specified name has been reset,
	 * and that this post-processor should clear any metadata for the affected bean.
	 * <p>The default implementation is empty.
	 * @param beanName the name of the bean
	 * @since 5.1
	 * @see DefaultListableBeanFactory#resetBeanDefinition
	 */
	default void resetBeanDefinition(String beanName) {
	}

}
